package controladores;

import org.apache.http.Header;
import org.apache.http.message.BasicHeader;

import com.google.gson.Gson;

import entidades.Movil;
import entidades.usuarios.Chofer;

import utils.Constantes;
import utils.Encriptador;
import utils.json.JSONParser;

public class ControladorChoferes extends BaseControlador
{
	public ControladorChoferes ()
	{
		super (Constantes.URL_COMPLETA + Constantes.CHOFERES);
	}
	
	/**
	 * Cambia el estado del chofer a ocupado.
	 * @param idChofer la id del chofer.
	 * @return true si se pudo completar la operacion.
	 */
	public boolean ocupado (long idChofer)
	{
		String res = helper.doGet("ocupado?id=" + idChofer);
		
		if (res != null)
			return Boolean.valueOf(res);
		
		return false;
	}
	
	/**
	 * Cambia el estado del chofer a disponible.
	 * @param idChofer la id del chofer.
	 * @return true si se pudo completar la operacion.
	 */
	public boolean disponible (long idChofer)
	{
		String res = helper.doGet("disponible?id=" + idChofer);
		
		if (res != null)
			return Boolean.valueOf(res);
		
		return false;
	}
	
	/**
	 * Cancela el viaje activo. Para que un viaje sea cancelable este debe estar en estado asignado.
	 * @param idViaje la id del viaje.
	 * @return true si se pudo completar la operacion.
	 */
	public boolean cancelarViaje (long idViaje)
	{
		String res = helper.doGet("cancelar?id=" + idViaje);
		
		if (res != null)
			return Boolean.valueOf(res);
		
		return false;
	}
	
	/**
	 * Finaliza el viaje. Para que un viaje sea finalizable este debe estar en estado iniciado.
	 * @param idViaje la id del viaje.
	 * @param calificacion del viaje.
	 * @return true si se pudo completar la operacion.
	 */
	public boolean finalizarViaje (long idViaje,int calificacion)
	{
		String res = helper.doGet(Constantes.FINALIZAR_VIAJE + "?id=" + idViaje + "&calificacion=" + calificacion);
		
		if (res != null)
			return Boolean.valueOf(res);
		
		return false;
	}
	
	/**
	 * Registra el codigo GCM del chofer en el sistema.
	 * @param idChofer la id del chofer.
	 * @param gcm el codigo GCM.
	 * @return true si se pudo completar la operacion.
	 */
	public boolean registrarGCM (long idChofer, String gcm)
	{
		Header header = new BasicHeader ("codigo", gcm);
		
		String res = helper.doPost("cargarCodigo?id=" + idChofer, header, null);
		
		if (res != null)
			return Boolean.valueOf(res);
		
		return false;
	}
	
	/**
	 * Registra un chofer en el sistema.
	 * @param chofer el chofer a registrar.
	 * @return el codigo resultado.
	 */
	public int registrarChofer (Chofer chofer)
	{
		String res = helper.doPost(Constantes.REGISTRAR, null, new Gson().toJson(chofer));
		
		if (res != null)
		{
			try
			{
				return Integer.parseInt(res);
			}
			catch (NumberFormatException ex)
			{
				return -1;
			}
		}
		
		return -1;
	}
	
	public int registrarChofer (long idPasajero, Movil movil)
	{
		String res = helper.doPost(Constantes.Choferes.REGISTRAR_FROM_PASAJERO + "?idPasajero=" + idPasajero, null, new JSONParser<Movil>(Movil.class).toJson(movil));
		
		if (res != null)
			return Integer.parseInt(res);
		
		return -1;
	}
	
	public long iniciarSesion (String email, String clave, String gcm)
	{
		Chofer chofer = new Chofer(email, Encriptador.encriptar(clave), gcm);
		
		String res = helper.doPost(Constantes.Choferes.INICIAR_SESION, null, new JSONParser<Chofer>(Chofer.class).toJson(chofer));
		
		if (res != null)
			return Long.parseLong(res);
		
		return -1;
	}
	
	public boolean cerrarSesion (long idChofer)
	{
		String res = helper.doGet(Constantes.Choferes.CERRAR_SESION + "?id=" + idChofer);
		
		if (res != null)
			return Boolean.valueOf(res);
		
		return false;
	}
	
	public Chofer checkDatos (String email, String clave)
	{
		Chofer chofer = new Chofer(email, Encriptador.encriptar(clave));
		
		String res = helper.doPost(Constantes.Choferes.CHECK_DATOS, null, new JSONParser<Chofer>(Chofer.class).toJson(chofer));
		
		if (res != null)
			return new JSONParser<Chofer>(Chofer.class).fromJson(res);
		
		return null;
	}
}
